#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;
// 总结:
// 线程在创建并执行的时候,也是需要等待的(若不等待会引起类似与僵尸进程的问题-->内存泄漏)
// 1.线程谁先运行和调度器有关
// 2.线程一旦退出,都可能导致整个进程整体退出
// 3.线程的返回值(主线程可能需要关心新线程的执行结果--若不关心可以使用线程分离,结束后自动回收资源)
// 4.线程中绝对不要调用exit-->它是终止进程的
// 5.线程的退出:pthread_exit(在新线程里使用), pthread_cancel(在主线程中取消新线程)
// 6.线程被取消, join的时候, 退出码是-1 (PTHREAD_CANCELED)



void *threadRoutine(void *args)
{
    int i = 0;
    int *data = new int[10];
    while (1)
    {
        cout << (char *)args << " Running: "  << endl;
        sleep(1);
        data[i] = i;
        if (++i == 3)
            break;
    }
    // return (void *)10; // 谁等待就返回给谁(一般给主线程)
    cout << "new thread exit"<<endl;


    //exit(10);  //线程中绝对不要调用exit-->它是终止进程的
    //线程退出:
    //pthread_exit((void*) 13);
    //return (void *)data;
}

int main()
{
    pthread_t tid;
    // a.创建线程
    pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1");

    //取消线程
    sleep(1);
    pthread_cancel(tid);

    // b.等待线程
    int *ret = nullptr;
    pthread_join(tid, (void **)&ret);
    cout << " main thread wait: ... ret: " << (long long)ret << endl;

    for (int i = 0; i < 3; i++)
    {
        cout << ret[i] << endl;
    }


    return 0;
}


